iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0
SideProject30

HOW TO GO系列 第 4

04. 組合型別

  • 分享至 

  • xImage
  •  

陣列 (Array)

array 長度是固定的,在編譯階段就會決定分配多少位址,相較於 slice 比較少用

package main

import "fmt"

func main() {

	var a1 [3]int
	a2 := [3]int{}
	a3 := [3]int{1, 2, 3}
	a4 := [...]int{1, 2, 3} // ... 代替長度,以數量推斷長度

	fmt.Println(a1) // [0 0 0]
	fmt.Println(a2) // [0 0 0]
	fmt.Println(a3) // [1 2 3]
	fmt.Println(a4) // [1 2 3]

	// n := 3
	// a5:= [n]int{} // 不能編譯

	fmt.Println(a4[0])         // 1
	fmt.Println(a4[len(a4)-1]) // 3

	// 印出 index 及 value
	for i, v := range a4 {
		fmt.Println(i, v)
	}

	// 二維陣列
	v1 := [3][2]int{}
	v2 := [3][2]int{{1, 1}, {2, 2}, {3, 3}}

	fmt.Println(v1) // [[0 0] [0 0] [0 0]]
	fmt.Println(v2) // [[1 1] [2 2] [3 3]]
}

切片 (Slice)

slice 可以在執行階段動態分配位址,使用上比較彈性。

package main

import "fmt"

func main() {
	var a1 []int
	a2 := []int{}
	a3 := []int{1, 2, 3}

	fmt.Println(a1) // []
	fmt.Println(a2) // []
	fmt.Println(a3) // [1 2 3]

	// 使用 make() 建立
	// func make([]T, len, cap) []T
	slice := make([]int, 5)

	fmt.Println(slice)      // [0 0 0 0 0]
	fmt.Println(len(slice)) // 5
	fmt.Println(cap(slice)) // 5
}

  • ptr:指向底層陣列的指標
  • len:該 slice 的數量
  • cap:該 slice 第一個可讀取元素開始至底層陣列的數量
package main

import "fmt"

func main() {

	a1 := []int{}
	fmt.Println(a1) // []

	// 新增元素
	a1 = append(a1, 1)
	fmt.Println(a1) // [1]

	// 建立新的 slice
	a2 := a1[:]
	fmt.Println(a2) // [1]

	// 但是參考同樣位址,因此修改 a2 同樣會修改到 a1
	a2[0] = 2
	fmt.Println(a1) // [2]

	// 使用 copy()
	a3 := make([]int, len(a1))
	copy(a3, a1)
	a3[0] = 100
	fmt.Println(a1) // [2]
}

Map

package main

import "fmt"

func main() {
	scores := make(map[string]int)

	scores["Alice"] = 90
	scores["Bob"] = 85

	aliceScore := scores["Alice"]
	fmt.Println(aliceScore)

	// 檢查鍵是否存在
	// _ 代表忽略這個回傳值
	_, ok := scores["Bob"]
	fmt.Println(ok)

	// 刪除元素
	delete(scores, "Bob")

	fmt.Println("Scores:")
	for key, value := range scores {
		fmt.Printf("%s: %d\n", key, value)
	}
}

結構 (Struct)

(對比於其他程式語言就是 class

package main

import "fmt"

type Point struct {
	X int
	Y int
}

func main() {
	var point1 Point

	// 如果不指定 key,會依 struct 欄位順序給值
	point2 := Point{1, 2}

	// 指定 key
	point3 := Point{
		Y: 4,
		X: 3,
	}

	fmt.Println(point1) // {0 0}
	fmt.Println(point2) // {1 2}
	fmt.Println(point3) // {3 4}

	// 取欄位值
	fmt.Println(point3.X, point3.Y) // 3 4
}

JSON

package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {

	// json -> struct
	data := `{
		"name": "Molecule Man",
		"age": 29
	}`
	user := User{}
	err := json.Unmarshal([]byte(data), &user)
	if err != nil {
		fmt.Println("parse error")
		return
	}
	fmt.Println(user) // {Molecule Man 29}

	// struct -> json
	byteSlice, _ := json.Marshal(user)

	fmt.Print(string(byteSlice)) // {"name":"Molecule Man","age":29}
}


上一篇
03. 基本資料型別
下一篇
05. 函式&方法 (Function & Method)
系列文
HOW TO GO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言